﻿/***  File Header  ************************************************************/
/**
* @file P4thVM.cpp
*
* PICO FORTH仮想マシン
* @author	shozo fukuda
* @date		作成 Tue Feb 14 19:18:40 2006
* @date		修正 $Date: 06/04/18 16:05 $
* System	Generic <br>
*
*******************************************************************************/

/*******************************************************************************
* IMPORTS:
*******************************************************************************/
#include "P4th.h"	/* 呼出用 */

/*******************************************************************************
* CONSTANT:
*******************************************************************************/

/*******************************************************************************
* TYPE:
*******************************************************************************/

/*******************************************************************************
* MACRO:
*******************************************************************************/

/*******************************************************************************
* GLOBAL VARIABLE:
*******************************************************************************/

/***  Module Header  ******************************************************}}}*/
/**
* データスタック・プッシュ
* @par 解説
*   データスタックに値valueをプッシュします。
**/
/**************************************************************************{{{*/
void P4th::Push(
long value)
{
	if (mSP >= mDSize) {
		return;
	}
	mS[mSP++] = value;
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック・ポップ
* @par 解説
*   データスタックから値をポップし関数値として返します。
*
* @return スタックトップの値
**/
/**************************************************************************{{{*/
long P4th::Pop()
{
	if (mSP < 1) {
		return 0;
	}

	return mS[--mSP];
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック回転
* @par 解説
*   スタックトップからindexだけ下のデータが、スタックトップに来るように
*   データを回転入れ替えする
**/
/**************************************************************************{{{*/
void P4th::Roll(
long index)
{
	if ((mSP - index) < 0) {
		return;
	}
	
	long val = mS[mSP - index];

	for (int i = index; i >= 2; i--) {
		mS[mSP - i] = mS[mSP - i + 1];
	}

	mS[mSP - 1] = val;
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック反転
* @par 解説
*   スタックトップのデータがindexだけ下になるようにデータを回転入れ替えする
**/
/**************************************************************************{{{*/
void P4th::Reverse(
long index)
{
	if ((mSP - index) < 0) {
		return;
	}
	
	long val = mS[mSP - 1];

	for (int i = 2; i <= index; i++) {
		mS[mSP - i + 1] = mS[mSP - i];
	}

	mS[mSP - index] = val;
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック・ピック
* @par 解説
*   スタックトップからindexだけ下のデータを返す
*
* @retval スタックトップからindexだけ下のデータ
**/
/**************************************************************************{{{*/
long& P4th::At(
long index)
{
	if ((mSP - index) < 0) {
		return mS[0];
	}
	
	return mS[mSP - index];
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック削除
* @par 解説
*   スタックトップからindexだけ下のデータを削除する
**/
/**************************************************************************{{{*/
void P4th::Crush(
long index)
{
	if ((mSP - index) < 0) {
		return;
	}

	for (int i = index; i >= 2; i--) {
		mS[mSP - i] = mS[mSP - i + 1];
	}

	mSP--;
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック深さ
* @par 解説
*   データスタック深さを返す
*
* @retval データスタック深さ
**/
/**************************************************************************{{{*/
long P4th::Depth()
{
	return mSP;
}

/***  Module Header  ******************************************************}}}*/
/**
* データスタック破棄
* @par 解説
*   データスタックを全て破棄する
**/
/**************************************************************************{{{*/
void P4th::Clr()
{
	mSP = 0;
}

/***  Module Header  ******************************************************}}}*/
/**
* リターンスタック・プッシュ
* @par 解説
*   リターンスタックに値valueをプッシュする
**/
/**************************************************************************{{{*/
void P4th::RPush(
long value)
{
	if (mRP >= mRSize) {
		return;
	}
	mRS[mRP++] = value;
}

/***  Module Header  ******************************************************}}}*/
/**
* リターンスタック・ポップ
* @par 解説
*   リターンスタックのトップをポップして返す
*
* @retval リターンスタックのトップ
**/
/**************************************************************************{{{*/
long P4th::RPop()
{
	if (mRP < 1) {
		return 0;
	}

	return mRS[--mRP];
}

/***  Module Header  ******************************************************}}}*/
/**
* リターンスタック・ピック
* @par 解説
*   リターンスタックのトップからindexだけ下のデータを返す
*
* @retval リターンスタックのトップからindexだけ下のデータ
**/
/**************************************************************************{{{*/
long& P4th::RAt(
long index)
{
	if ((mRP - index) < 0) {
		return mRS[0];
	}
	
	return mRS[mRP - index];
}

/* end of P4thVM.cpp */

